import requests
import base64
import numpy as np
import sounddevice as sd
import io
import json


def tts_client(text, server_url="http://localhost:5555/tts"):
    """
    向 TTS 服务器发送文本并播放返回的音频。

    Args:
        text (str): 要合成的文本
        server_url (str): TTS 服务器的 URL
    """
    try:
        # 准备 POST 请求数据
        payload = {"text": text}
        headers = {"Content-Type": "application/json"}

        # 发送 POST 请求
        response = requests.post(server_url, json=payload, headers=headers)
        response.raise_for_status()  # 检查请求是否成功

        # 解析响应
        result = response.json()
        if result.get("status") != "success":
            print(f"服务器错误: {result.get('error', '未知错误')}")
            return

        # 处理返回的 wavs
        wavs = result.get("wavs", [])
        if not wavs:
            print("未收到音频数据")
            return

        # 播放每个音频片段
        for i, wav in enumerate(wavs):
            try:
                # 解码 base64 数据
                wav_bytes = base64.b64decode(wav["data"])
                # 还原 numpy 数组
                wav_data = np.load(io.BytesIO(wav_bytes))
                sample_rate = wav["sample_rate"]
                # 播放音频
                print(f"播放音频片段 {i + 1} (采样率: {sample_rate} Hz)")
                sd.play(wav_data, samplerate=sample_rate)
                sd.wait()  # 等待音频播放完成
            except Exception as e:
                print(f"播放音频片段 {i + 1} 失败: {e}")

        print("所有音频片段播放完成")

    except requests.exceptions.RequestException as e:
        print(f"请求服务器失败: {e}")
    except json.JSONDecodeError:
        print("服务器响应格式错误")
    except Exception as e:
        print(f"客户端错误: {e}")


def main():
    # 测试文本
    test_text = "锄禾日当午，汗滴禾下土。Hello world! 谁知盘中餐，粒粒皆辛苦。"

    # 调用客户端
    tts_client(test_text)


if __name__ == "__main__":
    main()